package com.cskaoyan.java._1handle._1catch;

/**
 * 显然，Java默认的异常处理机制，总会导致程序终止执行，这不能够满足我们的需求。
 * 并且编译时异常还会强制程序员手动进行处理
 * 所以我们有必要学习一下手动的异常处理方式。这也是整个Java异常学习的重点！
 *
 * 异常处理的方式一: 捕获异常对象,并处理该异常
 * 使用语法: try..catch
 *
 * 1.单分支try...catch
 * 顾名思义，其语法为：
 * try {
 * // 可能出现异常的，正常的代码逻辑
 * } catch(要捕获的异常类类名 对象名) {
 * // 在catch分支中写处理异常的代码，操作捕获的异常对象
 * }
 * 解释:
 *      1.try代码块中放可能出现异常的，正常的代码逻辑.(就是能够通过编译,但是运行可能出现问题的代码)
 *      2.catch代码块的"()"里放要捕获异常的类型以及对象的名字
 *          (之所以要写对象名,是因为在catch代码块中可以用这个异常对象)
 *      3.catch代码块中书写的代码就是在异常被抛出且被捕获后的处理逻辑
 *      4.异常如果抛出且被捕获处理,就不会做默认处理了.(程序不会再终止执行了!)
 *
 * 注意事项:
 *      1.关于catch中捕获异常对象的匹配:
 *          怎么算匹配呢？
 *          可以就是这个异常类的对象
 *          也可以是这个异常类的子类对象
 *          但是一般来说,尽量写准确的子类,精确针对异常做处理,不要写宽泛模糊的父类
 *
 *      2.单分支的try...catch还可以使用以下语法结构，表示同时匹配多个异常类型：
 *          try{
 *              // 可能出现异常的，正常的代码逻辑
 *          }catch(要捕获的异常类类名1 | 要捕获的异常类类名2  对象名){
 *              // 在catch分支中写处理异常的代码，操作捕获的异常对象
 *          }
 *          注意: 这里"|"不是逻辑运算符或,它也没有短路形式,这里就理解成"同时匹配"的语义.
 *
 *      3.try代码块中放通过编译但可能运行出错的代码.为了代码的可读性考虑
 *          应该将尽量少的代码放进try代码块
 *          最好就是可能产生异常的那一句代码!
 *
 *      4.(重点)try代码块中一旦产生异常,那么就不会继续向下执行了,而是直接去匹配catch代码块做异常处理
 *          所以:
 *          try代码块中要么不产生异常,要么最多产生一个异常
 *
 * @since 15:08
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo implements Cloneable{
    public static void main(String[] args) {
        System.out.println("6666666");
        int[] arr = null;
        try {
            System.out.println(10 / 0);
            System.out.println(arr.length);
        } catch (ArithmeticException | NullPointerException e) {
            System.out.println("程序抛出了异常!");
        }
        System.out.println("777777777");

        System.out.println("-----------------------");
        new Demo().test();
        System.out.println("------------------------");
    }

    public void test() {
        try {
            clone();
        } catch (CloneNotSupportedException e) {
            System.out.println("发生了克隆不支持异常!");
        }
    }
}
